﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using UricaoWeb.LogicaDeNegocios.Propiedad;
using UricaoWeb.LogicaDeNegocios.Seguridad_y_Roles;
using UricaoWeb.Datos.Excepciones.Propiedad;

namespace UricaoWeb.Presentacion
{
    public partial class API_propiedades_AgregarPropiedad : API_Seguridad_Principal
    {
        private ControladorPropiedad _controladorPropiedad = new ControladorPropiedad();
        private Logica_Usuario _usuario;

        protected void Page_Load(object sender, EventArgs e)
        {
            var master = Master as MasterPage;
            if (master != null)
            {
                master.actualizar_label();
            }
            base.validar_usuario();

            if (Session["user"] != null)
            {
                if (!IsPostBack)
                {
                    CargaInicial();
                }
            }
            else
            {
                Server.Transfer("API_Seguridad_Login_.aspx", false);
            }

        }

        #region Métodos carga Inicial, llenado estructuras, validaciones...

        public Logica_Usuario Usuario
        {
            get { return _usuario; }
            set { _usuario = value; }
        }

        /// <summary>
        /// Función para realizar la carga inicial de la página, inicializa, llena estructuras, etc
        /// </summary>
        public void CargaInicial()
        {
            Usuario = (Logica_Usuario)Session["user"];
            LlenarListaTipos();
            LlenarListaHoteles();
        }

        /// <summary>
        /// Función para llenar el DropDownList con los tipos de 
        /// propiedades que se solicitan al controlador
        /// </summary>
        public void LlenarListaTipos()
        {
            DropDownListTipo.DataSource = _controladorPropiedad.ListarTiposPropiedad();
            DropDownListTipo.DataBind();
        }

        /// <summary>
        /// Función para llenar el DropDownList con los distintos hoteles 
        /// que tienen propiedades que se solicitan al controlador
        /// </summary>
        public void LlenarListaHoteles()
        {
            DropDownListHotel.Enabled = false;

            try
            {
                DropDownListHotel.DataSource = _controladorPropiedad.ListarPropiedadesHoteles();
                DropDownListHotel.DataValueField = "idHotel";
                DropDownListHotel.DataTextField = "nombreHotel";
                DropDownListHotel.SelectedIndex = DropDownListHotel.Items.IndexOf(DropDownListHotel.Items.FindByValue(Convert.ToString(_usuario.FkHotel)));
                DropDownListHotel.DataBind();
            }
            catch (PropiedadException ex)
            {
                string mensaje = ex.Message;

                ScriptManager.RegisterStartupScript(Page, Page.GetType(), "redirect script",
                            "alert('"+ mensaje +"'); location.href='API_propiedades_GestionHotel.aspx';", true);
            
            }
        }

        /// <summary>
        /// Función para validar la longitud de la entrada de los textbox
        /// Si hay algún error se desplega un mensaje de error al usuario en forma de alerta
        /// </summary>
        /// <returns>
        /// Devuelve true si los textbox pasan todas las validaciones, false en caso contrario
        /// </returns>
        public bool ValidarEntradasTextBox()
        {
            if (!_controladorPropiedad.ValidarCampoTexto(3, 50, TextNombre.Text.Length))
            {
                ScriptManager.RegisterClientScriptBlock(this, this.GetType(), "alertMessage", "alert('Campo Nombre Min(3)-Max(50) Caracteres')", true);
                return false;
            }
            else if (!_controladorPropiedad.ValidarCampoTexto(5, 100, TextDescripcion.Text.Length))
            {
                ScriptManager.RegisterClientScriptBlock(this, this.GetType(), "alertMessage", "alert('Campo Descripción Min(3)-Max(50) Caracteres')", true);
                return false;
            }
            else if (!_controladorPropiedad.ValidarCampoTexto(5, 100, TextUbicacion.Text.Length))
            {
                ScriptManager.RegisterClientScriptBlock(this, this.GetType(), "alertMessage", "alert('Campo Ubicación Min(3)-Max(50) Caracteres')", true);
                return false;
            }
            return true;
        }

        #endregion

        #region Métodos interacción usuario

        /// <summary>
        /// Método disparado al hacer click en el botón agregar
        /// se verifica la entrada de los textbox y luego se llama al controlador para agregar la propiedad
        /// luego se le notifica al usuario el resultado del intento de agregación
        /// </summary>
        protected void botonAgregar_Click(object sender, EventArgs e)
        {
            bool flagInsert = false;

            if (ValidarEntradasTextBox())
            {
                try
                {
                    flagInsert = _controladorPropiedad.AgregarPropiedad
                        (Convert.ToInt32(DropDownListHotel.SelectedItem.Value), TextNombre.Text, DropDownListTipo.SelectedItem.Value,
                        TextDescripcion.Text, TextUbicacion.Text, this.Image1.ImageUrl);
                }
                catch (PropiedadException ex)
                {
                    string mensaje = ex.Message;

                    ScriptManager.RegisterStartupScript(Page, Page.GetType(), "redirect script",
                                "alert('" + mensaje + "'); location.href='API_propiedades_GestionHotel.aspx';", true);
                }

                if (flagInsert == true)
                {
                    ScriptManager.RegisterStartupScript(Page, Page.GetType(), "redirect script",
                            "alert('La propiedad fue agregada con éxito'); location.href='API_propiedades_AgregarPropiedad.aspx';", true);
                }
                else
                {
                    ScriptManager.RegisterStartupScript(Page, Page.GetType(), "redirect script", //aca se coloca el codigo del error
                            "alert('Hubo un problema al agregar la propiedad'); location.href='API_propiedades_AgregarPropiedad.aspx';", true);
                }


            }
        }

        /// <summary>
        /// Método disparado al hacer click en el botón cancelar
        /// para abortar la operación de agregar propiedad
        /// </summary>
        protected void botonCancelar_Click(object sender, EventArgs e)
        {
            Server.Transfer("API_propiedades_GestionHotel.aspx", false);
        }

        /// <summary>
        /// Método disparado al hacer click en el boton subir imagen
        /// se verifica que el tipo de imagen sea el correcto y se sube la imagen
        /// si no se desplega un mensaje de error
        /// </summary>
        protected void ButtonUpload_Click(object sender, EventArgs e)
        {
            if (FileUpload1.HasFile)
            {
                if (_controladorPropiedad.VerificarTipoImagen(FileUpload1.FileName))
                {
                    FileUpload1.SaveAs(Server.MapPath("~/Presentacion/images/propiedad_" + this.FileUpload1.FileName));
                    Image1.ImageUrl = "~/Presentacion/images/propiedad_" + this.FileUpload1.FileName;
                }
                else
                {
                    ScriptManager.RegisterClientScriptBlock(this, this.GetType(), "alertMessage", "alert('Solo imágenes gif, png, jpg y jpeg')", true);
                }
            }
        }

        #endregion
    }
}